use serde::{Deserialize, Serialize};
use ts_rs::TS;
use yata::core::PeriodType;

use super::IndicatorActionWrap;

/// 在股票软件中，MACD指标是“Moving Average Convergence Divergence”的缩写，中文名为“移动平均收敛/发散”，是一种常用的技术分析工具，用于分析股票价格趋势、动量和反转点。MACD指标由三部分组成：快速线（DIF）、慢速线（DEA，也称为信号线）和柱状图（BAR）。
/// 对于MACD(12,89,9)的具体含义如下：
///
/// 12: 这个数字代表快速EMA（指数移动平均线）的周期长度。在这个例子中，快速EMA是根据过去12个周期（通常指日，但也可以是其他时间单位）的收盘价计算得出的。
///
/// 89: 这个数字代表慢速EMA的周期长度。慢速EMA覆盖更长的时间范围，这里是过去89个周期的收盘价。慢速EMA相较于快速EMA，对价格变动反应更为迟缓。
///
/// 9: 这个数字指的是用于计算信号线（DEA）的EMA周期长度。信号线是对快速线（DIF）的又一次平滑处理，以进一步过滤噪音，帮助确认趋势和转折点。这里是取快速线DIF的9日EMA。
///
/// 因此，MACD(12,89,9)意味着该指标通过计算12日和89日EMA的差值（即DIF），然后计算DIF的9日EMA（即DEA），以此来分析股票价格的动向和潜在的买卖时机。柱状图则通常表示DIF与DEA之间的差异，进一步直观展示两线的聚合与分离情况，帮助交易者判断市场动量的变化。
///
/// 在保存MACD计算结果时，通常会保存以下三个关键值：DIFF,DEA,BAR
/// 因此，除了DIFF和DEA之外，保存MACD柱状图的值也是非常重要的，这三个值共同构成了MACD指标的完整分析信息。在实际应用中，这三者结合使用能提供更全面的市场分析视角。
///
/// 参见 [MACD](https://docs.rs/yata/latest/yata/indicators/struct.MACD.html)
///
#[derive(Debug, Serialize, Deserialize, Default, TS, Clone)]
#[ts(export)]
pub struct MACD {
    /// Every `Indicator` proceed an input of [`OHLCV`](crate::core::OHLCV) and returns an `IndicatorResult`
    /// which consist of some returned raw values and some calculated signals.
    ///
    /// `Indicator` may return up to 4 signals and 4 raw values at each step
    /// 2 signal
    /// When MACD crosses Signal line upwards, returns full buy signal.
    /// When MACD crosses Signal line downwards, returns full sell signal.
    /// Otherwise returns no signal.
    pub signal0: Option<IndicatorActionWrap>,

    /// When MACD crosses zero line upwards, returns full buy signal.
    /// When MACD crosses zero line downwards, returns full sell signal.
    /// Otherwise returns no signal.
    pub signal1: Option<IndicatorActionWrap>,

    /// MACD value：  MACD指标的主线（DIF）
    /// Range in (-inf; +inf).
    pub macd: f64,

    /// Signal line value，MACD指标的信号线（DEA）
    ///Range in (-inf; +inf).
    pub signal: f64,
    /// MACD柱状图（BAR）: 这是由DIFF与DEA的差值进一步计算得到的，通常会乘以2以放大信号效果，
    /// 用于直观显示DIFF与DEA之间的差距，以及动量的增强或减弱。
    /// MACD柱状图的正负和高度变化，常用来判断市场动量和潜在的转折点。
    pub bar: f64,
}

/// MACD指标是“Moving Average Convergence Divergence”的缩写 ,MACD设置:
///
/// fast: 快速平均线的周期, 默认12
///
/// slow: 慢速平均线的周期,默认26
///
/// signal: 信号线的周期,默认9
///
#[derive(Serialize, Deserialize, Debug, TS, Clone, Copy)]
#[ts(export)]
pub struct MACDConfig {
    /// ma1: M
    /// Fast MA type.
    ///
    /// Default is EMA(12).
    ///
    /// Period range in [2; ma2’s period)
    pub ma1: PeriodType,
    ///ma2: M
    ///Slow MA type.
    ///
    ///Default is EMA(26).
    ///
    ///Period range in (ma1’s period; PeriodType::MAX)
    pub ma2: PeriodType,
    ///signal: M
    ///Signal line MA type.
    ///
    ///Default is EMA(9).
    ///
    ///Range in [2; PeriodType::MAX)    
    pub signal: PeriodType,
    // source: Source
    // Source value type. Default is Close

    // pub source: Source,
}

impl Default for MACDConfig {
    fn default() -> Self {
        Self {
            ma1: 12,
            ma2: 26,
            signal: 9,
        }
    }
}
